{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# XGBoost Regression"
      ],
      "metadata": {
        "nteract": {
          "transient": {
            "deleting": false
          }
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "import yfinance as yf\n",
        "yf.pdr_override()\n"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.193Z",
          "iopub.execute_input": "2022-05-29T02:09:45.198Z",
          "iopub.status.idle": "2022-05-29T02:09:45.210Z",
          "shell.execute_reply": "2022-05-29T02:09:45.232Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbol = 'AMD'\n",
        "start = '2014-01-01'\n",
        "end = '2018-08-27'\n",
        "\n",
        "# Read data \n",
        "dataset = yf.download(symbol,start,end)\n",
        "\n",
        "# View Columns\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  1 of 1 completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume\nDate                                                    \n2014-01-02  3.85  3.98  3.84   3.95       3.95  20548400\n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200\n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300\n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100\n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-02</th>\n      <td>3.85</td>\n      <td>3.98</td>\n      <td>3.84</td>\n      <td>3.95</td>\n      <td>3.95</td>\n      <td>20548400</td>\n    </tr>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.219Z",
          "iopub.execute_input": "2022-05-29T02:09:45.224Z",
          "iopub.status.idle": "2022-05-29T02:09:45.909Z",
          "shell.execute_reply": "2022-05-29T02:09:46.029Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.tail()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 3,
          "data": {
            "text/plain": "                 Open   High        Low      Close  Adj Close     Volume\nDate                                                                    \n2018-08-20  19.790001  20.08  19.350000  19.980000  19.980000   62983200\n2018-08-21  19.980000  20.42  19.860001  20.400000  20.400000   55629000\n2018-08-22  20.280001  20.92  20.209999  20.900000  20.900000   62002700\n2018-08-23  21.190001  22.32  21.139999  22.290001  22.290001  113444100\n2018-08-24  22.910000  24.00  22.670000  23.980000  23.980000  164328200",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2018-08-20</th>\n      <td>19.790001</td>\n      <td>20.08</td>\n      <td>19.350000</td>\n      <td>19.980000</td>\n      <td>19.980000</td>\n      <td>62983200</td>\n    </tr>\n    <tr>\n      <th>2018-08-21</th>\n      <td>19.980000</td>\n      <td>20.42</td>\n      <td>19.860001</td>\n      <td>20.400000</td>\n      <td>20.400000</td>\n      <td>55629000</td>\n    </tr>\n    <tr>\n      <th>2018-08-22</th>\n      <td>20.280001</td>\n      <td>20.92</td>\n      <td>20.209999</td>\n      <td>20.900000</td>\n      <td>20.900000</td>\n      <td>62002700</td>\n    </tr>\n    <tr>\n      <th>2018-08-23</th>\n      <td>21.190001</td>\n      <td>22.32</td>\n      <td>21.139999</td>\n      <td>22.290001</td>\n      <td>22.290001</td>\n      <td>113444100</td>\n    </tr>\n    <tr>\n      <th>2018-08-24</th>\n      <td>22.910000</td>\n      <td>24.00</td>\n      <td>22.670000</td>\n      <td>23.980000</td>\n      <td>23.980000</td>\n      <td>164328200</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 3,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.918Z",
          "iopub.execute_input": "2022-05-29T02:09:45.924Z",
          "iopub.status.idle": "2022-05-29T02:09:45.935Z",
          "shell.execute_reply": "2022-05-29T02:09:46.033Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],1,0)\n",
        "dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,0)\n",
        "dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,0)\n",
        "dataset['Returns'] = dataset['Adj Close'].pct_change()\n",
        "dataset = dataset.dropna()"
      ],
      "outputs": [],
      "execution_count": 4,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.943Z",
          "iopub.execute_input": "2022-05-29T02:09:45.948Z",
          "iopub.status.idle": "2022-05-29T02:09:45.955Z",
          "shell.execute_reply": "2022-05-29T02:09:46.037Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 5,
          "data": {
            "text/plain": "(1170, 10)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 5,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.963Z",
          "iopub.execute_input": "2022-05-29T02:09:45.968Z",
          "iopub.status.idle": "2022-05-29T02:09:45.979Z",
          "shell.execute_reply": "2022-05-29T02:09:46.041Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = dataset[['Open', 'High', 'Low', 'Volume', 'Increase_Decrease', 'Buy_Sell_on_Open', 'Buy_Sell', 'Returns']].values\n",
        "y = dataset['Adj Close'].values"
      ],
      "outputs": [],
      "execution_count": 6,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:45.986Z",
          "iopub.execute_input": "2022-05-29T02:09:45.991Z",
          "iopub.status.idle": "2022-05-29T02:09:45.998Z",
          "shell.execute_reply": "2022-05-29T02:09:46.044Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "import xgboost as xgb\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)"
      ],
      "outputs": [],
      "execution_count": 7,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:46.004Z",
          "iopub.execute_input": "2022-05-29T02:09:46.010Z",
          "iopub.status.idle": "2022-05-29T02:09:46.811Z",
          "shell.execute_reply": "2022-05-29T02:09:46.877Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import GridSearchCV\n",
        "\n",
        "param_grid = {\"max_depth\":    [4, 5],\n",
        "              \"n_estimators\": [500, 600, 700],\n",
        "              \"learning_rate\": [0.01, 0.015]}"
      ],
      "outputs": [],
      "execution_count": 8,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:46.817Z",
          "iopub.execute_input": "2022-05-29T02:09:46.822Z",
          "iopub.status.idle": "2022-05-29T02:09:46.830Z",
          "shell.execute_reply": "2022-05-29T02:09:46.881Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model = xgb.XGBRegressor(eval_metric='rmsle')"
      ],
      "outputs": [],
      "execution_count": 9,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:46.836Z",
          "iopub.execute_input": "2022-05-29T02:09:46.842Z",
          "iopub.status.idle": "2022-05-29T02:09:46.854Z",
          "shell.execute_reply": "2022-05-29T02:09:46.885Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "search = GridSearchCV(model, param_grid, cv=5).fit(X_train, y_train)\n",
        "\n",
        "print(\"The best hyperparameters are \",search.best_params_)"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "The best hyperparameters are  {'learning_rate': 0.015, 'max_depth': 4, 'n_estimators': 700}\n"
          ]
        }
      ],
      "execution_count": 10,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:09:46.864Z",
          "iopub.execute_input": "2022-05-29T02:09:46.870Z",
          "iopub.status.idle": "2022-05-29T02:10:05.969Z",
          "shell.execute_reply": "2022-05-29T02:10:06.010Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model = xgb.XGBRegressor(learning_rate = search.best_params_[\"learning_rate\"],\n",
        "                           n_estimators  = search.best_params_[\"n_estimators\"],\n",
        "                           max_depth     = search.best_params_[\"max_depth\"],\n",
        "                           eval_metric='rmsle')\n",
        "\n",
        "model.fit(X_train, y_train)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 11,
          "data": {
            "text/plain": "XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1,\n             colsample_bynode=1, colsample_bytree=1, eval_metric='rmsle',\n             gamma=0, gpu_id=-1, importance_type='gain',\n             interaction_constraints='', learning_rate=0.015, max_delta_step=0,\n             max_depth=4, min_child_weight=1, missing=nan,\n             monotone_constraints='()', n_estimators=700, n_jobs=20,\n             num_parallel_tree=1, random_state=0, reg_alpha=0, reg_lambda=1,\n             scale_pos_weight=1, subsample=1, tree_method='exact',\n             validate_parameters=1, verbosity=None)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 11,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:10:05.981Z",
          "iopub.execute_input": "2022-05-29T02:10:05.988Z",
          "shell.execute_reply": "2022-05-29T02:10:06.452Z",
          "iopub.status.idle": "2022-05-29T02:10:06.353Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_pred = model.predict(X_test)"
      ],
      "outputs": [],
      "execution_count": 12,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:10:06.367Z",
          "iopub.execute_input": "2022-05-29T02:10:06.377Z",
          "iopub.status.idle": "2022-05-29T02:10:06.391Z",
          "shell.execute_reply": "2022-05-29T02:10:06.457Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import mean_squared_log_error\n",
        "RMSLE = np.sqrt( mean_squared_log_error(y_test, y_pred))\n",
        "print(\"The score is %.5f\" % RMSLE )"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "The score is 0.01417\n"
          ]
        }
      ],
      "execution_count": 13,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:10:06.403Z",
          "iopub.execute_input": "2022-05-29T02:10:06.411Z",
          "iopub.status.idle": "2022-05-29T02:10:06.424Z",
          "shell.execute_reply": "2022-05-29T02:10:06.461Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from xgboost import plot_importance\n",
        "\n",
        "plt.style.use('fivethirtyeight')\n",
        "plt.rcParams.update({'font.size': 16})\n",
        "\n",
        "fig, ax = plt.subplots(figsize=(12,6))\n",
        "plot_importance(model, max_num_features=8, ax=ax)\n",
        "plt.show()"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 864x432 with 1 Axes>",
            "image/png": "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cckz/38CgKeX5oAye/ZslStXTnPnzpWtrW2Sf8DLli2b7LdY/3Xu3Dn169dPrVq10rRp02Rvb28+M/OoTz75RLt27ZK/v3+K/Zm+PZO6HcETyC1tZ3wzFmOcORjnjJexYxzTuYgkKUeOx1+pvGbNGtnb26tFixbmZXZ2dmrRooUmT56su3fvysHBQSdPntSmTZs0Y8aMFMPJzZs3FRoaqv79+yc7HxMA8OTSHFAiIiLUuXNn2draJtvG1dU11U+SP378uGJjY9W2bVv5+fkl2ebWrVvau3evAgMDZTKZ0loyACAbCw8PV/HixZU7d26L5eXKldO9e/d04sQJlStXznx5lqOjo1577TXt3LlTjo6OCgwM1NixY5U/f35JD+dg3r59W+7u7urYsaPWr18vW1tb1atXT2PGjLF4cDEAIO3SPEne3t5et2/fTrHNmTNnEt1+OClBQUFq0qSJJKl58+YymUxJTjD8+eefdf36dbVt2zat5QIAsrkrV64k+eWWs7Ozeb0k/fPPP5KkXr16qXTp0lq0aJFGjhyp9evXq0WLFoqLi7NoN2LECNna2mrBggWaPHmyDh48qCZNmuj69euZsFcA8OxK8xmUChUqaPPmzbp//36Sp8CvXr2qzZs3q2rVqo/ta/DgwapUqZKGDBmiCRMmyNfXV66uronaLViwQG5ubmrYsGFaywUAIFUSAkitWrU0YcIESVK9evX03HPP6Z133tGmTZsUEBBgble8eHF988035hvFlChRQg0bNtTChQvVpUsX6+wEADwD0hxQunXrprffflvvvPOOxeR4SYqOjlbv3r11+fJldevW7bF9lShRQl5eXpIkLy8vVatWLVGbs2fPatu2berevbvs7J74sS0AgGdIwsT4R50/f16SdOrUKd27d8+83NbWVhcuXEi0zeHDhyVJ165dU0REhB48eCBJ8vHxsWhbvHhxSdIvv/wiT09P81UEFStW1LFjx8ztnJyclCdPHoWFhalu3brpsZupktRYIH0xxhmPMc4cRhnnMmXKpLg+zZ/4mzdvrl69emnq1KlavXq18ubNK0ny9vbWhQsXFB8fr+Dg4MdOZk+tH3/8UXFxcWrXrl269AcAyPqS+p9bgQIFJEmenp7mUCFJ1apV09atW1WkSBGLeSiLFy9Wzpw51aBBAzk4OKhu3boaO3as3NzcLPqPiYmR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\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 14,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:10:06.433Z",
          "iopub.execute_input": "2022-05-29T02:10:06.439Z",
          "iopub.status.idle": "2022-05-29T02:10:06.618Z",
          "shell.execute_reply": "2022-05-29T02:10:06.631Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn import metrics\n",
        "\n",
        "print('MAE:', metrics.mean_absolute_error(y_test, y_pred))\n",
        "print('MSE:', metrics.mean_squared_error(y_test, y_pred))\n",
        "print('RMSE:', np.sqrt(metrics.mean_squared_error(y_test, y_pred)))"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "MAE: 0.09061099034527463\n",
            "MSE: 0.04297599802450726\n",
            "RMSE: 0.20730653155293313\n"
          ]
        }
      ],
      "execution_count": 16,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-05-29T02:10:06.663Z",
          "iopub.execute_input": "2022-05-29T02:10:06.668Z",
          "iopub.status.idle": "2022-05-29T02:10:06.678Z",
          "shell.execute_reply": "2022-05-29T02:10:06.687Z"
        }
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.13",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "argv": [
        "C:/Users/Tin Hang/Anaconda3\\python.exe",
        "-m",
        "ipykernel_launcher",
        "-f",
        "{connection_file}"
      ],
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "nteract": {
      "version": "0.28.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}